﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net.Sockets;
using System.Xml;


public partial class phch : System.Web.UI.Page
{
    //string system = "E9E59CA5-823E-43A6-92F6-9625336CAEC1";   //идентификация
    string system = "E9E59CA5-823E-43A6-92F6-9625336CAEC0";   //демо - идентификация
    /// </summary>
    public class StateObject
    {
        public bool connected = false;	// ID received flag
        public Socket workSocket = null;	// Client socket.
        public Socket partnerSocket = null;	// Partner socket.
        public const int BufferSize = 1024;	// Size of receive buffer.
        public byte[] buffer = new byte[BufferSize];// Receive buffer.
        public System.Text.StringBuilder sb = new System.Text.StringBuilder();//Received data String.
        public string id = String.Empty;	// Host or conversation ID
        public DateTime TimeStamp;
        public StateObject()
        {
            for (int i = 0; i < BufferSize; i++)
                buffer[i] = 0;

        }
    }

    protected void ReadCallback(IAsyncResult ar)
    {
        // Сюда мы попадаем по факту прихода пакета информации отсервера
        // Учитываем, что данная функция - другой поток и в данный момент соединение с сервером уже оборвано самим сервером
        string content = "";
        StateObject state = (StateObject)ar.AsyncState;
        XmlDocument RDoc = new XmlDocument();
        content = System.Text.Encoding.Default.GetString(state.buffer);
        content = content.Substring(0, content.IndexOf('\0'));
        if (content.ToUpper().IndexOf("SUCCESS")>-1)
        {
            Response.Write("SUCCESS");
        }
        else
        {
            Response.Write(content);
        }
        completed_event.Set();
    }

    System.Threading.AutoResetEvent completed_event = new System.Threading.AutoResetEvent(false);
    System.Threading.AutoResetEvent timeout_event = new System.Threading.AutoResetEvent(false);
    public void OnElapsed(object source, System.Timers.ElapsedEventArgs e)
    {
            timeout_event.Set();
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if ((Request.Params["ID"] != null) && (Request.Params["ID"] != ""))
        {
            try
            {
                StateObject state = new StateObject();
                TcpClient client = new TcpClient(); // Создали клиента
                XmlDocument xmld = new XmlDocument(); // Создали документ
                XmlElement ixmle = xmld.CreateElement("request"); // Формируем запрос
                XmlAttribute xmla = xmld.CreateAttribute("type");
                xmla.Value = "identification";
                ixmle.Attributes.Append(xmla);
                xmla = xmld.CreateAttribute("sysid");
                xmla.Value = system;
                ixmle.Attributes.Append(xmla);
                XmlElement cxmle = xmld.CreateElement("check");
                xmla = xmld.CreateAttribute("type");
                xmla.Value = "phone";
                cxmle.Attributes.Append(xmla);
                xmla = xmld.CreateAttribute("id");
                xmla.Value = "+" + Request.Params["ID"].ToUpper().Trim();
                cxmle.Attributes.Append(xmla);
                xmla = xmld.CreateAttribute("wait");
                if ((Request.Params["WAIT"] == null) || (Request.Params["WAIT"].ToUpper().Trim() == ""))
                    xmla.Value = "45";
                else
                    xmla.Value = Request.Params["WAIT"].ToUpper().Trim(); ;
                System.Timers.Timer TOTimer = new System.Timers.Timer();
                TOTimer.Interval = (Convert.ToInt16(xmla.Value) + 5) * 1000;
                TOTimer.Elapsed += OnElapsed;
                cxmle.Attributes.Append(xmla);
                ixmle.AppendChild(cxmle);
                xmld.AppendChild(ixmle); // Закончили формировать запрос
                client.Connect("176.221.12.14", 8888); // Открыли соединение
                client.Client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(this.ReadCallback), state); // Запустили ожидание входящей информации
                TOTimer.AutoReset = false;
                TOTimer.Start();
                bool stop = false;
                while (!stop)
                {
                    client.Client.Send(System.Text.Encoding.UTF8.GetBytes(xmld.OuterXml)); // Отправили запрос
                    int flag = System.Threading.WaitHandle.WaitAny(new System.Threading.WaitHandle[] { completed_event, timeout_event });
                    switch (flag)
                    {
                        case 0:
                            stop = true;
                            break;
                        case 1:
                            client.Client.Disconnect(true);
                            System.Xml.XmlDocument ResponseXml = new System.Xml.XmlDocument();
                            System.Xml.XmlElement RootNode = ResponseXml.CreateElement("response");
                            System.Xml.XmlAttribute StateAttr = ResponseXml.CreateAttribute("state");
                            StateAttr.Value = "FAIL";
                            RootNode.Attributes.Append(StateAttr);
                            System.Xml.XmlAttribute DescrAttr = ResponseXml.CreateAttribute("description");
                            DescrAttr.Value = "Timed out";
                            RootNode.Attributes.Append(DescrAttr);
                            ResponseXml.AppendChild(RootNode);
                            Response.Write(ResponseXml.OuterXml);
                            stop = true;
                            break;
                        default: break;
                    }
                }
            }
            catch (Exception Ex)
            { 
                Response.Write("Error: "+Ex.Message);
            }
        }
        else
        {
            Response.Write("Bad request");
        }
    }
}